package com.bwie.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bwie.mapper.TbGoodsMapper;
import com.bwie.pojo.TbGoods;
import com.bwie.service.TbGoodsService;
import com.bwie.utils.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Set;

@Service
@Transactional
public class TbGoodsServiceImpl extends ServiceImpl<TbGoodsMapper, TbGoods> implements TbGoodsService {

    @Autowired
    TbGoodsMapper tbGoodsMapper;

    @Autowired
    StringRedisTemplate stringRedisTemplate;
    /**
     * @description: tb商品列表查询
     * @author: xushuaihang
     * @Date: 2024/6/17 12:04
     * @param:
     * @return: com.bwie.utils.R
    **/
    @Override
    public R tbgoodsList() {

        ZSetOperations<String, String> zSetOperations = stringRedisTemplate.opsForZSet();

        List<TbGoods> list = tbGoodsMapper.tbgoodsList();

        for (TbGoods tbGoods : list) {

            Set<ZSetOperations.TypedTuple<String>> browseNum = zSetOperations.rangeWithScores("browseNum", 0, -1);

            for (ZSetOperations.TypedTuple<String> stringTypedTuple : browseNum) {

                if(String.valueOf(tbGoods.getId()).equals(stringTypedTuple.getValue())) {

                    tbGoods.setBrowseNum(stringTypedTuple.getScore().intValue());

                }

            }

        }

        return R.ok().data("list",list);
    }

    /**
     * @description: tb根据id查看详情
     * @author: xushuaihang
     * @Date: 2024/6/17 12:20
     * @param:
     * @param id
     * @return: com.bwie.utils.R
    **/
    @Override
    public TbGoods getTbgoodsById(Integer id) {

        return tbGoodsMapper.getTbgoodsById(id);
    }


//根据商品的浏览量、销量统计统计本周热销商品排名，统计后的热销商品数据存放到Redis中，合理设置Redis过期时间
// ，并配合定时任务（使用Quartz定时器技术）每30分钟更新热点数据，确保数据新鲜度。

//（1）根据商品的浏览量和销量的总和，统计本周热销商品排名后，将热销商品数据以Sorted Set数据类型存储到Redis中。（3分）

//（2）使用Quartz定时器技术实现每30分钟更新一次热销商品数据。定时任务负责从数据库中获取新增数据，并更新到Redis中。
// （环境复杂度：1、按一定时间间隔执行任务（初级） 2、按指定时间执行任务（初级））（5分）

//    @Scheduled(cron = "0 0/30 * * * ?")
    @Scheduled(cron = "0 0/5 * * * ?")
    public void  hotspotRanking(){

        List<TbGoods> list = tbGoodsMapper.selectList(new QueryWrapper<>());

        stringRedisTemplate.delete("hotspotRanking");

        ZSetOperations<String, String> zSetOperations = stringRedisTemplate.opsForZSet();

        int i = 0;
        for (TbGoods tbGoods : list) {
            if(i++>50){
                break;
            }
            Double num = Double.valueOf(tbGoods.getBrowseNum()+tbGoods.getGoodsSales());

            zSetOperations.incrementScore("hotspotRanking",tbGoods.getId()+"",num);

        }

    }




}
